Imaginemos que queremos mostrar un vector por la pantalla. Una forma fácil es simplemente hacer un bucle que recorra todas las casillas y muestre un elemento del vector y luego un espacio (para separar los diferentes elementos). Por ejemplo, si el vector es:
vector<int> v;
y previamente lo hemos rellenado con algunos enteros, entonces podemos mostrarlo por pantalla así:
for (int i = 0; i < v.size(); i++) { cout << v[i] << ' '; } cout << endl;
El cout << endl final es opcional. Si el vector es [1, 2, 3, 4, 5], se verá por pantalla:
1 2 3 4 5
Pero qué sucedería si quisíeramos mostrar el vector así:
[1, 2, 3, 4, 5]
Esta notación es más precisa, delimita el vector con corchetes, por si queremos poner más de uno en la misma línea:
[1, 2, 3] [4, 5, 6]
y además separa los enteros por comas.
Para mostrar el vector así haremos una acción muestra, con la cabecera siguiente:
void muestra(const vector<int>& v);
Esta acción deberá tener en cuenta todas las posibilidades:
Cuando miramos la documentación de una clase, es típico que un método como size (que ya conocemos) aparezca declarado así:
int vector<T>::size() const;
Esto hay que explicarlo un poco. Hay 4 partes:
En resumen: tenemos un método size, que devuelve un entero, no tiene parámetros, llamable sobre objetos de la clase vector con cualquier tipo de casilla, y que no modifica el vector. Todo eso es lo que aparece en la declaración.
Veamos entonces cómo se declara empty:
bool vector<T>::empty() const;
Este método retorna cierto cuando el vector está vacío (tiene 0 elementos). Para vectores, es equivalente sacar el tamaño con size y compararlo con 0 pero para otros contenedores que veremos más adelante no es lo mismo.
La declaración es:
T vector<T>::front() const;
Ésta declaración tiene una curiosidad, y es que el método front devuelve el tipo T. Eso nos dice que si el vector es de enteros, entonces devuelve un entero, si es de chars entonces devuelve un char, etc. La razón es que front devuelve el primer elemento (el de la casilla 0).
Hagamos la acción muestra utilizando estos métodos. Para tener en cuenta el caso del vector vacío, de momento usaremos empty:
void muestra(const vector<int>& v) { cout << '['; if (!v.empty()) { // mostrar el vector } cout << ']; }
Esta implementación, por ahora, como mínimo tiene en cuenta el caso de si el vector está vacío. En el interior del if pondremos el código que muestra el vector sabiendo que tiene almenos una casilla:
cout << v.front(); for (int i = 1; i < v.size(); i++) { cout << ", " << v[i]; }
El truco consiste en mostrar el primer elemento y luego mostrar los otros con una coma delante. Claro, el número de comas que hay que poner es una menos que el número de enteros: entonces mostramos el primer elemento por separado y luego los otros con una coma delante. Hay otras maneras equivalentes de hacer lo mismo.
Esta es la acción completa:
void muestra(const vector<int>& v) { cout << '['; if (!v.empty()) { cout << v.front(); for (int i = 1; i < v.size(); i++) { cout << ", " << v[i]; } } cout << ']'; }
En preparación